# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:张广勤
@Web site: https://www.tunan.wang
@Github:www.github.com
 
@File:inverse_function1_0.py
@Time:2024/8/2 9:33

@Motto:不积跬步无以至千里，不积小流无以成江海！
"""

import matplotlib.pyplot as plt
import numpy as np

# 定义原函数和反函数
def original_function(x):
    a, b = 2, 3  # 你可以修改a和b的值来观察不同的直线
    return a * x + b

def inverse_function(x):
    a, b = 2, 3  # 这些值应该与原函数中的a和b相同
    return (x - b) / a

# 创建x值数组
x = np.linspace(-10, 10, 400)  # 从-10到10生成400个点

# 计算原函数和反函数的y值
y_original = original_function(x)
y_inverse = inverse_function(x)  # 注意：这里我们实际上是在计算一个“伪”反函数的y值


plt.rcParams['font.sans-serif'] = ['SimHei']  # 用黑体替换默认字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
# 绘制原函数图像
plt.plot(x, y_original, label='y = ax + b (原函数)')

# 由于线性函数的“反函数”在标准坐标系中与原函数是同一条直线，
# 我们只需要再次绘制这条直线，但标记它为“反函数”以说明这一点。
# 注意：这不是真正的反函数绘制方式，因为线性函数的反函数在标准坐标系下与原函数重合。
# 但为了演示，我们仍然绘制它。
plt.plot(y_inverse, x, 'r--', label='y = (x - b) / a (伪反函数，实际与原函数重合)')

# 或者，更清晰地，我们可以只绘制原函数，并用注释说明反函数的情况
# plt.plot(x, y_original, label='y = ax + b')
# plt.text(0, 0, '反函数为 x = (y - b) / a，但在标准坐标系中与原函数重合', fontsize=10, ha='center')

# 设置图例
plt.legend()

# 设置坐标轴标签
plt.xlabel('x')
plt.ylabel('y')

# 显示网格
plt.grid(True)

# 显示图像
plt.show()

# 注意：由于线性函数的特殊性，上面的“伪反函数”绘制部分只是为了演示如何编写代码，
# 在实际应用中，我们通常会省略这部分，因为线性函数的图像和反函数图像在标准坐标系下是相同的。